package com.glp.work.flow.service;

import com.alibaba.fastjson.JSONArray;
import com.glp.common.reponse.BaseResult;
import com.glp.fbs.api.dto.appInfo.AppUserReq;
import com.glp.fbs.api.dto.appInfo.AppUserResp;
import com.glp.fbs.api.dto.user.PersonInfoDto;
import com.glp.fbs.api.dto.user.PersonInfoWithAppReq;
import com.glp.work.flow.dto.AppInfoResp;
import com.glp.work.flow.dto.RoleDTO;
import com.glp.work.flow.dto.UserDTO;
import com.glp.work.flow.dto.UserEntity;
import com.glp.work.flow.dto.request.PersonInfoReq;
import com.glp.work.flow.dto.request.RiskLevelQueryRequest;
import com.glp.work.flow.dto.response.RiskLevelQueryResponse;
import com.glp.work.flow.pojo.RoleCodes;
import com.glp.work.flow.request.RoleRequest;
import com.glp.work.flow.response.RolesResponse;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestHeader;

import java.util.List;

public interface UserService {
    List<RoleDTO> queryUserRolesById(String userId);

    BaseResult<UserDTO> getPersonInfo(String userNo);

    BaseResult<List<UserEntity>> getUserList(UserEntity user);

    BaseResult<UserEntity> getUserSingle(UserEntity user);

    /**
     * @description : 获取用户直属下级
     * @params : [userNo]
     * @returns : com.glp.common.reponse.BaseResult
     * @author : 郭永伟
     * @date : 2020/10/21
     */
    JSONArray getPersonSubordinate(String userNo);

    /**
     * @description : 根据appId和userNO查询用户信息
     * @params : [createUserId, appId]
     * @returns : com.glp.common.reponse.BaseResult
     * @author : 郭永伟
     * @date : 2020/9/24
     */
    PersonInfoDto getPersonInfo(String userId, String appId);

    /**
     * @description :获取当前登录用户用户所有的应用角色信息
     * @params : [userNo]
     * @returns : com.glp.common.reponse.BaseResult
     * @author : 郭永伟
     * @date : 2020/9/18
     */
    List<String> getPersonAllEnableRoles(@RequestHeader(value = "userNo") String userNo);

    /**
     * @MethodName: personInfosByRoleCodeList
     * @Description: 根据角色得到对应的用户列表
     * @Param: [userNo, appId, roleCodes]
     * @Return: com.glp.common.reponse.BaseResult
     * @Author: ywguo
     * @Date: 2020/6/9
     **/
    List<UserDTO> personInfosByRoleCodeList(@RequestBody RoleCodes roleCodes);

    /**
     * @MethodName: enabledRoles
     * @Description: 应用下可用用的角色列表
     * @Param: [userNo]
     * @Return: com.glp.common.reponse.BaseResult<java.util.List < com.glp.work.flow.dto.RoleDTO>>
     * @Author: ywguo
     * @Date: 2020/6/8
     **/
    List<RolesResponse> enabledRoles(RoleRequest roleRequest);


    /**
     * @description : 获取当前登录用户所在的系统的角色信息
     * @params : [userNo, appId]
     * @returns : com.glp.common.reponse.BaseResult<java.util.List<com.glp.work.flow.response.RolesResponse>>
     * @author : 郭永伟
     * @date : 2020/9/15
     */
    List<String> personRoles(String userNo, String appId);

    /**
     * @description : 根据appId和userList 获取用户信息，带有业务范围
     * @params : [req]
     * @returns : java.util.List<java.lang.String>
     * @author : 郭永伟
     * @date : 2020/11/4
    */
    List<UserDTO> getPersonInfos(String appId,PersonInfoReq req);

    /**
     * @description : 根据appId获取详情
     * @params : [appId]
     * @returns : com.glp.work.flow.dto.AppInfoResp
     * @author : 郭永伟
     * @date : 2020/12/24
    */
    AppInfoResp detailByAppId(String appId);

    /**
     * @description : 获取多人用户信息
     * @author : 郭永伟 
     * @Param      
     * @date : 2021/1/27
    */
    List<PersonInfoDto> getPersonInfos(PersonInfoReq req);

    /**
     * @description :根据app，角色code，业务范围，获取用户信息
     * @author : 郭永伟
     * @params
     * @date : 2021/1/28
    */
    List<AppUserResp> appInfoUsers(@RequestBody AppUserReq appUserReq);

    /**
     * @description : 批量查询用户信息，不实时调OA
     * @author : 郭永伟 
     * @params [req]     
     * @date : 2021/4/23
    */
    List<AppUserResp> getPersonWithBusinessList(PersonInfoWithAppReq req);

    List<RiskLevelQueryResponse> batchRiskLevel(RiskLevelQueryRequest request);
}
